/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package desarrollosoft.ghce.dao.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IAntecedentePatologicoDAO;
import desarrollosoft.ghce.entidades.AntecedentePatologico;
import desarrollosoft.ghce.entidades.Gravedad;
import desarrollosoft.ghce.entidades.Paciente;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author ariel
 */
@Repository("antecedentePatologicoDAO")
public class AntecedentePatologicoDAO implements IAntecedentePatologicoDAO {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<AntecedentePatologico> obtenerTodosAntecedentesPatologicos(Paciente paciente, Gravedad gravedad) {
        if (gravedad == null) { // si gravedad es null
            Query consulta = entityManager.createQuery(
                    "SELECT a FROM AntecedentePatologico a WHERE a.paciente = :paciente "
                    + "ORDER BY a.fecha DESC"
            );
            consulta.setParameter("paciente", paciente);
            return consulta.getResultList();
        } else { // sino, vino gravedad
            Query consulta = entityManager.createQuery(
                    "SELECT a FROM AntecedentePatologico a WHERE a.paciente = :paciente AND a.gravedad = :gravedad "
                    + "ORDER BY a.fecha DESC"
            );
            consulta.setParameter("paciente", paciente);
            consulta.setParameter("gravedad", gravedad);
            return consulta.getResultList();
        }
    }

    @Override
    public List<AntecedentePatologico> obtenerAntecedentesPatologicos(Paciente paciente, String textoBuscar, Gravedad gravedad) {
        if (gravedad == null) { // si gravedad es null
            Query consulta = entityManager.createQuery(
                    "SELECT a FROM AntecedentePatologico a WHERE a.paciente = :paciente "
                    + "AND a.diagnostico.nombre LIKE CONCAT('%',:textoBuscar,'%') ORDER BY a.fecha DESC"
            );
            consulta.setParameter("paciente", paciente);
            consulta.setParameter("textoBuscar", textoBuscar);
            return consulta.getResultList();
        } else { // sino, vino gravedad
            Query consulta = entityManager.createQuery(
                    "SELECT a FROM AntecedentePatologico a WHERE a.paciente = :paciente "
                    + "AND a.diagnostico.nombre LIKE CONCAT('%',:textoBuscar,'%') AND a.gravedad = :gravedad "
                    + "ORDER BY a.fecha DESC"
            );
            consulta.setParameter("paciente", paciente);
            consulta.setParameter("textoBuscar", textoBuscar);
            consulta.setParameter("gravedad", gravedad);
            return consulta.getResultList();
        }
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void crearAntecedentePatologico(AntecedentePatologico antecedente) throws Exception {
        entityManager.persist(antecedente);
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void modificarAntecedentePatologico(AntecedentePatologico antecedente) {
        entityManager.merge(antecedente);
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void eliminarAntecedentePatologico(AntecedentePatologico antecedente) {
        entityManager.remove( entityManager.merge(antecedente) );
    }

}
